<?php
/**
* 声明并实现文章处理的功能函数
*/

/**
* 如何计算问题的最精准的相似结果？
* 1、对标题进行关键词分析
* 2、对描述进行关键词分析
* 3、将两者关键词，按照8-2比例分配权重
* 4、生成包含关键词和关键词对应权重的数组
* 5、用数组与文库中内容进行相似度计算，得出相似文章
*/

/**
* @name   get_savable_vector 获取可用来直接存储的向量字符串
* @param  string title    待处理的标题或问题
* @param  string content  待处理的内容或描述
* @return string seriaStr 返回可直接用于存储于数据库的经过序列化的数组字符串
*/
function get_savable_vector( $title , $content ){
	$titleVct   = get_valid_words( $title );
	$contentVct = get_valid_words( $content );

	$qstVector = get_question_vector( $titleVct , $contentVct );

	return array_serialize( $qstVector );
}


/**
* @func 去除分词结果中无效属性的词汇，包括助词、标点符号
* @param string needle 待处理的字符串
* @param class  aipnlp  百度自然语言处理对象
*/
function get_valid_words( $needle ){
	require_once( ABSPATH . "/lib/common.php" );

	$deltypeArr = array( 'w' , 'u');
	$retArr     = array();

	@$wordArr = $aipnlp->lexer($needle);
	foreach ( (array)$wordArr['items'] as $word ) {
		if( !in_array( @$word['pos'] , $deltypeArr) ){
			$retArr[] = @$word['item'];
		}
	}

	return $retArr;
}

/**
* @name get_question_vector 获取问题的分析向量
* @param  array qstwordArr
* @param  array smrwordArr
* @return array qstVector 返回词汇向量
*/
function get_question_vector( $qstwordArr = array() , $smrwordArr = array() ){
	//1、获取分词及词汇数量数组
	@$qstwdcountArr = get_word_count( $qstwordArr );
	@$smrwdcountArr = get_word_count( $smrwordArr );

	//2、weighting ，数组加权
	@$qstwdweightArr = get_word_weight( $qstwdcountArr , 4 );
	@$smrwdweightArr = get_word_weight( $smrwdcountArr , 1 );

	//3、问题及描述加权数组合并
	$qstVector = mergewhtArr( $qstwdweightArr , $smrwdweightArr );

	return $qstVector;
}

/**
* @name get_word_count 获取包含词，及其对应数量的数组
* @param array qstwordArr
*/
function get_word_count( $qstwordArr = array() ){
	if( empty($qstwordArr) ){
		return false;
	}else{
		return array_count_values($qstwordArr);
	}
}

/**
* @name   get_word_weight 获取赋予权重之后的数组
* @param  array wdcountArr
* @param  int   weight
* @return array wdweightVector
*/
function get_word_weight( $wdcountArr = array() , $weight = 1 ){
	if( empty($wdcountArr) ){
		return false;
	}else{
		foreach ($wdcountArr as $word => $count) {
			$wdcountArr[$word] = $count * $weight;
		}
	}

	return $wdcountArr;
}

/**
* @name   mergewhtArr 合并问题和描述的加权数组
* @param  array qstwhtArr
* @param  array smrwhtArr
* @return array qstwhtArr 返回统一的问题向量
*/
function mergewhtArr( $qstwhtArr = array() , $smrwhtArr = array() ){

	foreach ((array)$qstwhtArr as $qstwht => $qstvalue) {
		if( isset($smrwhtArr[$qstwht]) ){
			$qstwhtArr[$qstwht] = $qstvalue + $smrwhtArr[$qstwht];
		}else{
			$qstwhtArr[$qstwht] = $qstvalue;
		}
	}

	foreach ((array)$smrwhtArr as $smrwht => $smrvalue) {
		if( !isset($qstwhtArr[$smrwht]) ){
			$qstwhtArr[$smrwht] = $smrvalue;
		}else{
			continue;
		}
	}

	return $qstwhtArr;
}

/**
* @name   array_serialize 将数组序列化
* @param  array needle 待处理的数组
* @return string serialized 处理后的数组字符串
*/
function array_serialize( $needle = array() ){
	if( is_array($needle) && !empty($needle) ){
		$serialized = addslashes( serialize( $needle ) );
		return $serialized;
	}else{
		return false;
	}
}

/**
* @name   array_unserialize 将字符串反序列化成字符串
* @param  string needle  待处理的字符串
* @return array  unserialized
*/
function array_unserialize( $needle = '' ){
	if( is_string( $needle ) ){
		$unserialized = unserialize( stripslashes( $needle ) );
		return $unserialized;
	}else{
		return false;
	}
}
